package org.bb.io.objectstreamdemo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class TestDriver2 {

	public static void main(String[] args) {
		test01();
	}

	public static void test01() {
		// 在内存中创建一个Student对象
		Student stu0 = new Student();
		// 设置属性
		stu0.setStuName("小明");
		stu0.setStuNo("150001");
		stu0.setStuSex("男");
		stu0.setStuAge(21);

		// 使用对象输出流，将stu0在内存中的状态进行持久化处理
		String strFileName = writeObject(stu0, "stu");

		// 从文件中读取写出的对象重写到内存
		Object obj = readObject(strFileName);

		// 向下溯型
		Student stu01 = (Student) obj;
		System.out.println("stu0.getstuAge:"+stu0.getStuAge());

		// 再读一次
		Object obj2 = readObject(strFileName);

		// 向下溯型
		Student stu02 = (Student) obj2;

		// 验证 ，从文件中读取的对象和内存中写出之前的对象是不是一个对象
		System.out.println("stu0 == stu01:" + (stu0 == stu01));
		System.out.println("stu01 == stu02:" + (stu01 == stu02));
	}

	/**
	 * 将对象从文件中读取到内存
	 * 
	 * @param strFilePath
	 *            被读取的保存对象的文件名
	 * @return 从文件中读取的对象
	 */
	private static Object readObject(String strFilePath) {
		// 默认范沪指
		Object obj = null;
		try {
			// 创建一个输入流对象
			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(strFilePath));
			// 读入对象
			obj = ois.readObject();

			// 对象读入流结束，关闭资源
			ois.close();
		} catch (Exception e) {
			// 对象输入流异常
			System.out.println("对象输入流异常:" + e.getMessage());
			// e.printStackTrace();
		}
		return obj;
	}

	/**
	 * 写出对象到指定名字的文件中
	 * 
	 * @param obj
	 *            被写出的对象
	 * @param strName
	 *            写出对象的保存文件名
	 * @return 写出对象的文件名
	 */
	private static String writeObject(Object obj, String strName) {
		// 返回值
		String strFilePath = "C:\\Users\\bql\\Desktop\\新建文件夹\\er1.dat";
		try {
			// 创建一个对象输出流
			ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(strFilePath)));

			// 使用对象输出流，将stu0在内存中的状态进行持久化处理
			oos.writeObject(obj);

			// 清空
			oos.flush();
			// 关闭资源
			oos.close();

			System.out.println("对象流写出完成");
		} catch (Exception e) {
			// 对象流异常
			System.out.println("对象输出流异常：" + e.getMessage());
			e.printStackTrace();
		}

		// 返回值
		return strFilePath;
	}
}
